<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>iptables详解 | 失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		<article>
	
		<h1>iptables详解</h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<h2 id="iptables简介"><a href="#iptables简介" class="headerlink" title="iptables简介"></a>iptables简介</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;netfilter/iptables（简称为iptables）组成Linux平台下的包过滤防火墙，与大多数的Linux软件一样，这个包过滤防火墙是免费的，它可以代替昂贵的商业防火墙解决方案，完成封包过滤、封包重定向和网络地址转换（NAT）等功能。</p>
<h2 id="iptables基础"><a href="#iptables基础" class="headerlink" title="iptables基础"></a>iptables基础</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;规则（rules）其实就是网络管理员预定义的条件，规则一般的定义为“如果数据包头符合这样的条件，就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中，这些规则分别指定了源地址、目的地址、传输协议（如TCP、UDP、ICMP）和服务类型（如HTTP、FTP和SMTP）等。当数据包与规 则匹配时，iptables就根据规则所定义的方法来处理这些数据包，如放行（accept）、拒绝（reject）和丢弃（drop）等。配置防火墙的 主要工作就是添加、修改和删除这些规则。</p>
<h2 id="iptables和netfilter的关系"><a href="#iptables和netfilter的关系" class="headerlink" title="iptables和netfilter的关系"></a>iptables和netfilter的关系</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;iptables和netfilter的关系是一个很容易让人搞不清的问题，很多知道iptables却不知道netfilter。其实iptables只是Linux防火墙的管理工具而已，位于/sbin/iptbles。真正实现防火墙功能的是netfilter，它是Linux内核中实现包过滤的内部结构。iptables只是netfilter的一个实现工具。</p>
<h2 id="iptables语法格式"><a href="#iptables语法格式" class="headerlink" title="iptables语法格式"></a>iptables语法格式</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables [-t 表名] [命令选项] [链名] [条件匹配] [-j 目标动作或跳转]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：表名、链名、用户指定iptables命令所操作的表和链，命令选项用于指定管理iptables规则的方式（比如：插入、增加、删除、查看等）；条件匹配用户指定对符合什么样条件的数据包进行处理；目标动作或跳转用于指定数据包的处理方式（比如允许通过、拒绝、丢弃、跳转（jump）给其它链处理）。</p>
<h2 id="iptables控制选项"><a href="#iptables控制选项" class="headerlink" title="iptables控制选项"></a>iptables控制选项</h2><h3 id="基本参数"><a href="#基本参数" class="headerlink" title="基本参数"></a>基本参数</h3><ul>
<li>-A 在指定链的末尾添加（append）一条新的规则</li>
<li>-D 删除（delete）指定链中的某一条规则，可以按规则序号和内容删除</li>
<li>-I 在指定链中插入（insert）一条新的规则，默认在第一行添加</li>
<li>-R 修改、替换（replace）指定链中的某一条规则，可以按规则序号和内容替换</li>
<li>-L 列出（list）指定链中所有的规则进行查看</li>
<li>-E 重命名用户定义的链，不改变链本身</li>
<li>-F 清空（flush）</li>
<li>-N 新建（new-chain）一条用户自己定义的规则链</li>
<li>-X 删除指定表中用户自定义的规则链（delete-chain）</li>
<li>-P 设置指定链的默认策略（policy）</li>
<li>-Z 将所有表的所有链的字节和数据包计数器清零</li>
<li>-n 使用数字形式（numeric）显示输出结果</li>
<li>-v 查看规则表详细信息（verbose）的信息</li>
<li>-V 查看版本(version)</li>
<li>-h 获取帮助（help）</li>
</ul>
<h3 id="描述规则基本参数"><a href="#描述规则基本参数" class="headerlink" title="描述规则基本参数"></a>描述规则基本参数</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这些规则参数用于描述的协议、源地址、目的地址、允许经过的网络接口，以及如何处理这些数据包。这些描述是对规则的基本描述。</p>
<ul>
<li><p>-p （protocol）指定协议，可以是tcp、udp、或者icmp，可以使用 <strong>all</strong> 来指定所有协议；<br>如果不指定 <strong>-p</strong> 参数，则默认是 <strong>all</strong> 值，这并不明智，请总是明确指定协议名称。<br>可以使用协议名（如tcp），或者是协议值（比如6代表tcp）来指定协议，映射关系查看 <code>/etc/protocols</code> ；<br>还可以使用 <strong>-protocol</strong> 参数代替 <strong>-p</strong> 参数</p>
</li>
<li><p>-s 源地址（source）<br>指定数据包的源地址；<br>参数可以使用IP地址、网络地址、主机名<br>-s 192.168.1.101 指定IP地址，<br>-s 192.168.1.10/24指定网络地址<br>不指定-s参数，就代表所有地址<br>还可以使用 <strong>-src</strong> 或者 <strong>-source</strong></p>
</li>
<li><p>-d 目的地址（destination）<br>指定目的地址<br>参数和-s相同<br>还可以使用 <strong>-dst</strong> 或者 <strong>destination</strong></p>
</li>
<li><p>-j 执行目标（jump to target）<br>指定了当与规则（RUle）匹配时如何处理数据包<br>可能的值是ACCEPT允许、DROP丢掉、REJECT拒绝、QUEUE队列、RETURN返回、MASQUERADE伪装（地址伪装，算是snat中的一种特例，可以实现自动化的snat）<br>还可以指定其他连接（Chain）作为目标</p>
</li>
<li><p>-i 输入接口（input initerface）<br>指定要处理来自哪个接口的数据包（一般指定网卡）<br>这些数据包即将进入 INPUT、FORWARD、PREROUTE链<br>例如：-i etho 指定了要处理经由eth0进入的数据包<br>不指定-i参数，那么将处理进入所有接口的数据包<br>如果出现<code>! -i eth0</code>，那么将处理所有经由eth0意外的接口进入的数据包。<br>出现<code>-i eth+</code>，那么将处理所有经由eth开都的接口进入的数据包<br>还可以使用-in-interface参数</p>
</li>
<li>-o 输出（out interface）<br>指定数据包由哪个接口输出<br>这些数据包即将进入FORWARD、OUTPUT、PORTROUTING链<br>不指定 <strong>-o</strong> 选项，那么系统哈斯那个的所有接口都可以作为输出接口<br>出现 <code>! -o eth0</code> 那么将从 <strong>eth0以外的接口</strong> 输出<br>出现 <code>! eth+</code> ，那么将仅从 <strong>eth开头的接口</strong> 输出<br>还可以使用 <strong>-out-initerface</strong> 参数</li>
</ul>
<h3 id="描述规则扩展参数"><a href="#描述规则扩展参数" class="headerlink" title="描述规则扩展参数"></a>描述规则扩展参数</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对规则有了基本描述以后，有时候还希望指定端口、TCP标志、ICMP类型等内容。</p>
<ul>
<li>–sport 源端口（source port） 针对 -p tcp 或者 -p udp<br>缺省情况下，将匹配所有端口<br>可以指定端口号或者端口名称，（例如，-sport 22 与 -sport ssh）<br><strong>/etc/services</strong> 文件描述了上述映射关系<br>从性能上讲，使用端口号更好<br>使用冒号可以匹配端口范围，如“-sport 22:100”<br>还可以使用 <strong>-source-port</strong> </li>
<li><p>–dport 目的端口（destination port） 针对 -p tcp 或者 -p udp<br>参数和-sport类似<br>还可以使用 <strong>-destination-port</strong></p>
</li>
<li><p>–tcp-flage TCP标志 针对 -p tcp<br>可以指定由逗号分割的多个参数<br>有效值可以是：SYN、ACK、FIN、RST、URG、PSH<br>可以使用 <strong>ALL</strong> 或者 <strong>NONE</strong></p>
</li>
<li>–icmp-type ICMP类型 针对 -p icmp<br>–icmp-type 0 表示Echo Reply<br>–icmp-type 8 表示Echo</li>
</ul>
<h2 id="iptables处理数据包的四种方式"><a href="#iptables处理数据包的四种方式" class="headerlink" title="iptables处理数据包的四种方式"></a>iptables处理数据包的四种方式</h2><ul>
<li>ACCEPT 允许数据包通过</li>
<li>DROP 直接丢弃数据包，不给任何回应信息</li>
<li>REJECT 拒绝数据包通过，必要时会给数据发送端一个响应的信息。</li>
<li>LOG在/var/log/messages文件中记录日志信息，然后将数据包传递给下一条规则</li>
</ul>
<h2 id="iptables传输数据包的过程"><a href="#iptables传输数据包的过程" class="headerlink" title="iptables传输数据包的过程"></a>iptables传输数据包的过程</h2><ol>
<li>当一个数据包进入网卡时，它首先进入PREROUTING链，内核根据数据包目的IP判断是否需要转送出去。 </li>
<li>如果数据包就是进入本机的，它就会沿着图向下移动，到达INPUT链。数据包到了INPUT链后，任何进程都会收到它。本机上运行的程序可以发送数据包，这些数据包会经过OUTPUT链，然后到达POSTROUTING链输出。 </li>
<li>如果数据包是要转发出去的，且内核允许转发，数据包就会如图所示向右移动，经过FORWARD链，然后到达POSTROUTING链输出。</li>
</ol>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E8%AF%A6%E8%A7%A3/01.png?raw=true" alt=""></figure></p>
<h2 id="iptables的规则表和链"><a href="#iptables的规则表和链" class="headerlink" title="iptables的规则表和链"></a>iptables的规则表和链</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;表（tables）提供的特定的功能，iptables内置了4个表，即filter表、nat表、mangle表、和raw表，分别用于实现包过滤，网络地址转换、包重构（修改）和数据跟踪处理。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;链（chains）是数据包传播的路径，每一条链其实就是众多规则中的一个检查清单，每一条链中可以有一条或数条规则。当一个数据包到达一个链时，iptables就会从链中第一条规则开始检查，看该数据包是否满足规则所定义的条件。如果满足，系统就会根据该条规则所定义的方法处理该数据包；否则iptables将继续检查下一条规则，如果该数据包不符号链中任一条规则，iptables就会根据该链预先定义的默认策略来处理数据包。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链。现在REHL5成了四张表五个链了，不过多出来的哪个表用的也不太多，所以基本还是和以前一样。下面是四张表五个链。需要明白这些表和链的关系及作用。</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E8%AF%A6%E8%A7%A3/02.png?raw=true" alt=""></figure></p>
<h2 id="规则表"><a href="#规则表" class="headerlink" title="规则表"></a>规则表</h2><ol>
<li><p>filter表——三个链：INPUT、FORWARD、OUTPUT<br>作用：过滤数据包，内核模块：iptables=_filter</p>
</li>
<li><p>Nat表——三个链：PREROUTING、POSTROUTING、OUTPUT<br>作用：用于网络地址转换（IP、端口），内核模块：iptable_nat</p>
</li>
<li><p>Mangle表——五个链：PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD<br>作用：修改数据包的服务类型、TTL，并且可以配置路由实现QOS，内核模块：iptable_mangle（设置策略时几乎不会用到它）</p>
</li>
<li><p>Raw表——两个链：OUTPUT、PREROUTING<br>作用：决定数据包是否被状态跟踪机制处理，内核模块：iptable_raw（用得不多）</p>
</li>
</ol>
<h2 id="规则链"><a href="#规则链" class="headerlink" title="规则链"></a>规则链</h2><ol>
<li>INPUT——进来的数据包应用此规则链中的策略</li>
<li>OUTPUT——外出的数据包应用此规则链中的策略</li>
<li>ROEWARD——转发数据包时应用此规则链中的策略</li>
<li>PREROUTING——对数据包做路由选择前应用此链中的规则（所有的数据包进来的时候都先由这个链处理）</li>
<li>POSTROUTING——对数据包作路由选择后应用此链中的规则（所有的数据包出来的时候都先由这个链处理）</li>
</ol>
<h2 id="规则表之间的有限顺序"><a href="#规则表之间的有限顺序" class="headerlink" title="规则表之间的有限顺序"></a>规则表之间的有限顺序</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Raw——Mangle——Nat——Filter</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;规则链之间的优先顺序分三种情况</p>
<h3 id="1、入站数据流向"><a href="#1、入站数据流向" class="headerlink" title="1、入站数据流向"></a>1、入站数据流向</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;从外界达到防火墙的数据包，先被PREROUTING规则链处理（是否修改数据包地址等），之后会进行路由选择（判断该数据包应该发往何处），如果数据包的目标主机是防火墙本机（比如说internet用户访问防火墙主机中的web服务器的数据包）， 那么内核将其传给INPUT链进行处理（决定是否允许通过等），通过以后再给系统上层的应用程序（比如apache服务器）进行响应。</p>
<h3 id="2、转发数据流向"><a href="#2、转发数据流向" class="headerlink" title="2、转发数据流向"></a>2、转发数据流向</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;来自外界的数据包到达防火墙后，首先被PREROUTING规则链处理，之后会进行路由选择，如果数据包的目标地址是其他外部地址（比如局域网用户通过网关访问QQ站点的数据包），则内核将其传递给FPRWARD链进行处理（是否转发或拦截），然后再交给POSTROUTING规则链（是否修改数据包的地址等）进行处理。</p>
<h3 id="3、出站数据流向"><a href="#3、出站数据流向" class="headerlink" title="3、出站数据流向"></a>3、出站数据流向</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;防火墙本机向外部地下hi发送的数据包（比如在防火墙主机中测试公网DNS服务器时），首先被OUTPUT规则链处理，之后进行路由选择，然后传递给POSTROUTING规则链（是否修改数据包的地址等）进行处理。</p>
<h2 id="管理和设置iptables规则"><a href="#管理和设置iptables规则" class="headerlink" title="管理和设置iptables规则"></a>管理和设置iptables规则</h2><p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E8%AF%A6%E8%A7%A3/03.jpg?raw=true" alt=""></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E8%AF%A6%E8%A7%A3/04.jpg?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面针对一个小需求讲述一下这个iptables规则如何设定：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;需求：只针对filter表，预设策略INPUT链DROP，其他两个链ACCEPT，然后针对192.168.137.0/24开通22端口，对所有网段开放80端口，对素有网段开放21端口。这个需求不复制，但是有很多条规则，所以最好写成脚本形式：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># vim /usr/local/sbin/iptables.sh</span></div><div class="line"></div><div class="line"><span class="meta">#!/bin/bash</span></div><div class="line"></div><div class="line">ipt=<span class="string">"/sbin/iptables"</span></div><div class="line"><span class="variable">$ipt</span> -F</div><div class="line"><span class="variable">$ipt</span> -P INPUT DROP</div><div class="line"><span class="variable">$ipt</span> -P OUTPUT ACCEPT</div><div class="line"><span class="variable">$ipt</span> -P FORWARD ACCEPR</div><div class="line"><span class="variable">$ipt</span> -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT</div><div class="line"><span class="variable">$ipt</span> -A INPUT -p tcp --dport 80 -j ACCEPT</div><div class="line"><span class="variable">$ipt</span> -A INPUT -p tcp --dport 21 -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;完成脚本编写后，直接运行即可。如果想开机启动时初始化防火墙规则，需要在 <code>/etc/rc.d/rc.local</code> 中添加一行 <code>/bin/bash /usr/local/sbin/iptables.sh</code></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sh /usr/local/sbin/iptables.sh</span></div><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL</span></div><div class="line">Chain INPUT (policy DROP 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination</div><div class="line">   20  1580 ACCEPT     tcp  --  *      *       192.168.137.0/24     0.0.0.0/0           tcp dpt:22</div><div class="line">    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80</div><div class="line">    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:21</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;运行脚本后，查看规则就是这样的，可以看到第一条规则中已经有20个包被放行了。关于icmp的包有一个比较常见的应用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">root@localhost ~]<span class="comment"># iptables -I INPUT -p icmp --icmp-type 8 -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>–icmp-type 这个选项是要跟 -p icmp 一起使用的，后i安指定类型编号。这个8指的是能在本机ping同其他机器，而其他机器不能ping通本机。</strong></p>
<h2 id="nat表的应用"><a href="#nat表的应用" class="headerlink" title="nat表的应用"></a>nat表的应用</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其实，linux的iptables功能是十分强大的，曾经有一个老师这样形容Linux的网络功能：只有想不到，没有做不到！也就是说只要能够想到的关于网络的应用，Linux都能实现。在日常生活中使用的路由器，它的功能就是分享上网。本来一跟网线过来（其实只有一个公网IP），通过路由器后，路由器分配了一个网段（私网IP），这样连接路由器的台机器都能连接internet，而远端的设备认为IP就是那个连接路由器的公网IP。这个路由器的功能其实就是有Linux的iptables实现的，而iptables又是通过nat表作用而实现的这个功能。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;举个例子来说明iptables如何实现的这个功能。假设机器上有两块网卡etho0和eth1，其中eth0的IP为10.0.2.68，eth1的IP为192.168.1.1.eth0连接了internet，但eth1没有连接，现在有另一台机器（192.168.1.2）和eth1是互通的，那么如何设置也能够让连接eth1的这台机器能够连接internet（即能和10.0.2.68互通）？</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># echo "1" &gt; /proc/sys/net/ipv4/ip_forward</span></div><div class="line">[root@localhost ~]<span class="comment"># iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;就是这样简单的两条命令就能实现上面的需求。第一个命令涉及到了内核参数相关的配置文件，它的目的是为了打开路由转发功能，否则无法实现应用。第二个命令则是iptables对nat表做了一个IP转发的操作，-o选项后跟设备名，表示出口的网卡，MASQUERADE表示伪装的意思。</p>
<h2 id="iptables防火墙规则的保存与恢复"><a href="#iptables防火墙规则的保存与恢复" class="headerlink" title="iptables防火墙规则的保存与恢复"></a>iptables防火墙规则的保存与恢复</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<code>iptables-save</code>把规则保存到文件中，再由目录rc.d下个脚本（/etc/rc.d/init.d/iptables）自动装载</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用命令<code>iptables-save</code>来保存规则。一般用</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables-save &gt; /etc/sysconfig/iptables</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;生成保存规则的文件/etc/sysconfig/iptables,</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也可以用</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">service iptables save</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;它能把规则自动保存在/etc/sysconfig/iptables中。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当计算机启动时，rc.d下的脚本将用命令iptables-restore调用这个文件，从而就自动恢复了规则。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<code>-nvL</code>就是查看规则，<code>-F</code>是把当前规则清除，但这个只是临时的，重启系统或者重启iptables服务后还回加载已经保存的规则，所以需要使用<code>/etc/init.d/iptables save</code>保存一下规则</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -F ; /etc/init.d/iptables save</div></pre></td></tr></table></figure>
<h2 id="使用实例"><a href="#使用实例" class="headerlink" title="使用实例"></a>使用实例</h2><h3 id="实例1：查看规则以及清除规则"><a href="#实例1：查看规则以及清除规则" class="headerlink" title="实例1：查看规则以及清除规则"></a>实例1：查看规则以及清除规则</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -nvL</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -t nat -nvL</span></div><div class="line">Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<code>-t</code>后面跟表名，<code>-nvL</code>即查看该表的规则，其中<code>-n</code>表示不针对IP反解析主机名；<code>-L</code>表示列出的意思；而<code>-v</code>表示列出的信息更加详细。。如果不加<code>-t</code>，则打印<code>filter</code>表的相关信息：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL</span></div><div class="line">Chain INPUT (policy ACCEPT 121 packets, 9013 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT 85 packets, 8828 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个和<code>-t filter</code>打印的信息是一样的。</p>
<h3 id="实例2：清除iptables规则"><a href="#实例2：清除iptables规则" class="headerlink" title="实例2：清除iptables规则"></a>实例2：清除iptables规则</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -F</div><div class="line">iptables -Z</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不加<code>-t</code>默认是针对表<code>filter</code>来操作的，<code>-F</code>表示把所有规则全部删除；<code>-Z</code>表示把包以及流量计数器清零。</p>
<h3 id="实例3：增加一条规则"><a href="#实例3：增加一条规则" class="headerlink" title="实例3：增加一条规则"></a>实例3：增加一条规则</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -A INPUT -s 10.72.11.12 -p tcp --sport 1234 -d 10.72.137.159 --dport 80 -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这就是增加一条规则，省略-t所以针对filter表。-A表示增加一条规则，另外还有-I表示插入一条规则，-D删除一条规则；后面个INPUT既链名称，还可以是OUTPUT或者FORWARD；-s后跟源地址；-p协议（tcp、udp、icmp）；<code>--sport/--dport</code>后跟源端口；-d后跟目的IP（主要针对内网或者外网）；-j后跟动作（DROP即把包丢掉，REJECT即包拒绝；ACCEPT即允许包）。</p>
<h3 id="实例4：插入一条规则，把来自1-1-1-1的所有数据包丢掉"><a href="#实例4：插入一条规则，把来自1-1-1-1的所有数据包丢掉" class="headerlink" title="实例4：插入一条规则，把来自1.1.1.1的所有数据包丢掉"></a>实例4：插入一条规则，把来自1.1.1.1的所有数据包丢掉</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -I INPUT -s 1.1.1.1 -j DROP</span></div></pre></td></tr></table></figure>
<h3 id="实例5：删除一条规则"><a href="#实例5：删除一条规则" class="headerlink" title="实例5：删除一条规则"></a>实例5：删除一条规则</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -D INPUT -s 1.1.1.1 -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;删除实例4中插入的规则。注意要删除一条规则时，必须和插入的规则一致，也就是说两条iptables命令，除了-I和-D不一样外，其他地方都一样</p>
<h3 id="实例6：把来自2-2-2-2并且是tcp协议到本机80端口的数据包球吊"><a href="#实例6：把来自2-2-2-2并且是tcp协议到本机80端口的数据包球吊" class="headerlink" title="实例6：把来自2.2.2.2并且是tcp协议到本机80端口的数据包球吊"></a>实例6：把来自2.2.2.2并且是tcp协议到本机80端口的数据包球吊</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -I INPUT -s 2.2.2.2 -p tcp --dport 80 -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要注意的是<code>--dport/--sport</code>必须要和<code>-p</code>选项一起使用，否则会出错。</p>
<h3 id="实例7：把发送到10-0-1-14的22端口的数据包丢掉"><a href="#实例7：把发送到10-0-1-14的22端口的数据包丢掉" class="headerlink" title="实例7：把发送到10.0.1.14的22端口的数据包丢掉"></a>实例7：把发送到10.0.1.14的22端口的数据包丢掉</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -I OUTPUT -p tcp --dport 22 -d 10.0.1.14 -j DROP</span></div></pre></td></tr></table></figure>
<h3 id="实例8：把来自192-168-0-0-24这个网段的并且作用在eth0上的数据包都放行"><a href="#实例8：把来自192-168-0-0-24这个网段的并且作用在eth0上的数据包都放行" class="headerlink" title="实例8：把来自192.168.0.0/24这个网段的并且作用在eth0上的数据包都放行"></a>实例8：把来自192.168.0.0/24这个网段的并且作用在eth0上的数据包都放行</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -A INPUT -s 192.168.0.0/24 -i eth0 -j ACCEPT</span></div><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL | grep '192.168.0.0/24'</span></div><div class="line">   65  4680 ACCEPT     all  --  eth0   *       192.168.0.0/24       0.0.0.0/0</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-I 和 -A 都是增加规则，它们的去区别是。 -A 可以说是往后排，-I 是直接插队到最前面。也就是说 -A 增加的规则是在最后面的，而 -I 增加的规则是在最前面的。数据包流向是从前往后走，所以如果想让一条规则最优先生效，那么就用 -I 插入一条规则。</p>
<h3 id="实例9：iptables删除某一条规则"><a href="#实例9：iptables删除某一条规则" class="headerlink" title="实例9：iptables删除某一条规则"></a>实例9：iptables删除某一条规则</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;iptables过多了，想删除某一条规则时，又不容易掌握当时创建时的规则。其实有一种比较简单的方法:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL --line-numbers</span></div><div class="line">Chain INPUT (policy ACCEPT 12 packets, 648 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line">1        0     0 DROP       tcp  --  *      *       2.2.2.2              0.0.0.0/0           tcp dpt:80 </div><div class="line">2      132  9309 ACCEPT     all  --  eth0   *       192.168.0.0/24       0.0.0.0/0           </div><div class="line"></div><div class="line">Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT 90 packets, 8816 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line">1        0     0 DROP       tcp  --  *      *       0.0.0.0/0            10.0.1.14           tcp dpt:22</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;删除某一条规则使用如下命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -D INPUT 2</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>-D后跟链名，然后是规则num，这个num就是查看iptables规则时第一列的值。</strong>再次查看刚才的规则，INPUT里已经没有第2条了</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL --line-numbers</span></div><div class="line">Chain INPUT (policy ACCEPT 7 packets, 504 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line">1        0     0 DROP       tcp  --  *      *       2.2.2.2              0.0.0.0/0           tcp dpt:80 </div><div class="line"></div><div class="line">Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT 5 packets, 604 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line">1        0     0 DROP       tcp  --  *      *       0.0.0.0/0            10.0.1.14           tcp dpt:22</div></pre></td></tr></table></figure>
<h3 id="实例10：接收目标端口为22的数据包"><a href="#实例10：接收目标端口为22的数据包" class="headerlink" title="实例10：接收目标端口为22的数据包"></a>实例10：接收目标端口为22的数据包</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT</div></pre></td></tr></table></figure>
<h3 id="实例11：拒绝所有其他数据包"><a href="#实例11：拒绝所有其他数据包" class="headerlink" title="实例11：拒绝所有其他数据包"></a>实例11：拒绝所有其他数据包</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -j DROP</div></pre></td></tr></table></figure>
<h3 id="实例12：iptables-P选项"><a href="#实例12：iptables-P选项" class="headerlink" title="实例12：iptables -P选项"></a>实例12：iptables -P选项</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">root@localhost ~]<span class="comment"># iptables -P INPUT DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-P选项经常用到，表示预设策略。 <strong>-P 后面跟链名，策略内容或者为DROP或者为ACCEPT，默认是ACCEPT。注意：如果在连接远程服务器，千万不要随便敲这个命令，因为一旦钓完回车就会断掉。</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>这个策略一旦设定后，只能使用 <code>iptables -P INPUT ACCEPT</code> 才能恢复成原始状态，而不能使用-F参数。</strong></p>
<h3 id="实例13：iptables实现内网机器访问外网"><a href="#实例13：iptables实现内网机器访问外网" class="headerlink" title="实例13：iptables实现内网机器访问外网"></a>实例13：iptables实现内网机器访问外网</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;环境：两台机器，一台可以访问外网、内网，一台只能访问内网</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;外网机器的外网IP：123.221.20.11；内网IP为：192.168.15.100</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;内网机器IP：192.168.15.101<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置方法：</p>
<ol>
<li>在外网机器上设置iptables规则：</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -t nat -A POSTROUTING -s 192.168.15.101 -j SNAT --to 123.221.20.11</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>注意</strong> :如果想让整个内网的机器全部上网，只需要把 <code>-s 192.168.15.101</code> 换成 <code>-s 192.168.15.0/255.255.255.0</code> 即可</p>
<ol>
<li>在带外网机器上打开转发<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先查看是否已经打开</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sysctl -a | grep 'net.ipv4.ip_forward'</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果值为1，则说明已经打开，否则需要修改匹配文件 <code>/etc/sysctl.conf</code></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;打开该配置文件，找到该参数，使其变为</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">net.ipv4.ip_forward = 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后运行</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sysctl -p</div></pre></td></tr></table></figure>
<ol>
<li>在内网机器上，设置其网关为 192.168.15.100</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># vim /etc/sysconfig/network-scripts/ifcfg-eth0 </span></div><div class="line"></div><div class="line">GATEWAY=192.168.15.100</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;重启网络服务即可</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">service network restart</div></pre></td></tr></table></figure>
<ol>
<li>测试内网机器是否可以上网</li>
</ol>
<h3 id="实例14：iptables限制syn速度"><a href="#实例14：iptables限制syn速度" class="headerlink" title="实例14：iptables限制syn速度"></a>实例14：iptables限制syn速度</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>原理</strong> ：每5s内tcp三次握手大于20次的属于不正常访问。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.0.101 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource</span></div><div class="line">[root@localhost ~]<span class="comment"># iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中192.168.0.0/255.255.255.0为不受限制的网段，192.168.0.101 为本机IP。该iptables策略，可有效预防syn攻击，也可以有效防止机器人发垃圾贴。</p>
<h3 id="实例15：拒绝进入防火墙的所有ICMP协议数据包"><a href="#实例15：拒绝进入防火墙的所有ICMP协议数据包" class="headerlink" title="实例15：拒绝进入防火墙的所有ICMP协议数据包"></a>实例15：拒绝进入防火墙的所有ICMP协议数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -I INPUT -p icmp -j REJECT</div></pre></td></tr></table></figure>
<h3 id="实例16-允许防火墙转发除ICMP协议以外的所有数据包"><a href="#实例16-允许防火墙转发除ICMP协议以外的所有数据包" class="headerlink" title="实例16:允许防火墙转发除ICMP协议以外的所有数据包"></a>实例16:允许防火墙转发除ICMP协议以外的所有数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -p ! icmp -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：使用“!”可以将条件取反</p>
<h3 id="实例17：拒绝转发来自192-168-1-10主机的数据，允许转发来自192-168-0-0-24网段的数据"><a href="#实例17：拒绝转发来自192-168-1-10主机的数据，允许转发来自192-168-0-0-24网段的数据" class="headerlink" title="实例17：拒绝转发来自192.168.1.10主机的数据，允许转发来自192.168.0.0/24网段的数据"></a>实例17：拒绝转发来自192.168.1.10主机的数据，允许转发来自192.168.0.0/24网段的数据</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -s 192.168.1.11 -j REJECT</div><div class="line">iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：注意要把拒绝的放在前面，不然就不起作用了。</p>
<h3 id="实例18：丢弃从外网接口（eth1）进入防火墙本机的源地址为私网地址的数据包"><a href="#实例18：丢弃从外网接口（eth1）进入防火墙本机的源地址为私网地址的数据包" class="headerlink" title="实例18：丢弃从外网接口（eth1）进入防火墙本机的源地址为私网地址的数据包"></a>实例18：丢弃从外网接口（eth1）进入防火墙本机的源地址为私网地址的数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP</div><div class="line">iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP</div><div class="line">iptables -A INPUT -i eth1 -s 10.0.0.0.0/8 -j DROP</div></pre></td></tr></table></figure>
<h3 id="实例19：封堵网段（192-168-1-0-24），两小时后解封"><a href="#实例19：封堵网段（192-168-1-0-24），两小时后解封" class="headerlink" title="实例19：封堵网段（192.168.1.0/24），两小时后解封"></a>实例19：封堵网段（192.168.1.0/24），两小时后解封</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">iptables -I INPUT -s 10.20.30.0/24 -j DROP</div><div class="line">iptables -I FORWARD -s 10.20.30.0/24 -j DROP</div><div class="line">at now 2 hours at&gt; iptables -D INPUT 1 at&gt; iptables -D FORWARD 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：这个策略借助crontab计划任务来完成，就再好不过了。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[1]  Stopped  at now 2 hours</div></pre></td></tr></table></figure>
<h3 id="实例20：只允许管理员从202-13-0-0-16网段使用SSH远程登录防火墙主机"><a href="#实例20：只允许管理员从202-13-0-0-16网段使用SSH远程登录防火墙主机" class="headerlink" title="实例20：只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机"></a>实例20：只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT</div><div class="line">iptables -A INPUT -p tcp --dport 22 -j DROP</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：这个用法比较适合对设备进行远程管理时使用，比如位于分公司中的SQL服务器需要被总公司的管理员管理时。</p>
<h3 id="实例21：允许本机开放从TCP端口20-1024提供的应用服务"><a href="#实例21：允许本机开放从TCP端口20-1024提供的应用服务" class="headerlink" title="实例21：允许本机开放从TCP端口20-1024提供的应用服务"></a>实例21：允许本机开放从TCP端口20-1024提供的应用服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT</div><div class="line">iptables -A INPUT -p tcp --sport 20:1024 -j ACCEPT</div></pre></td></tr></table></figure>
<h3 id="实例22：允许转发来自192-168-0-0-24局域网的DNS解析请求数据包"><a href="#实例22：允许转发来自192-168-0-0-24局域网的DNS解析请求数据包" class="headerlink" title="实例22：允许转发来自192.168.0.0/24局域网的DNS解析请求数据包"></a>实例22：允许转发来自192.168.0.0/24局域网的DNS解析请求数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT</div><div class="line">iptables -A FORWARD -s 192.168.0.0/24 -p udp --sport 53 -j ACCEPT</div></pre></td></tr></table></figure>
<h3 id="实例23：禁止其他主机ping防火墙主机，但是允许防火墙上ping其他主机"><a href="#实例23：禁止其他主机ping防火墙主机，但是允许防火墙上ping其他主机" class="headerlink" title="实例23：禁止其他主机ping防火墙主机，但是允许防火墙上ping其他主机"></a>实例23：禁止其他主机ping防火墙主机，但是允许防火墙上ping其他主机</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP</div><div class="line">iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT</div><div class="line">iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT</div></pre></td></tr></table></figure>
<h3 id="实例24：禁止转发来自MAC地址为00-0C-29-27-55-3F的和主机的数据包"><a href="#实例24：禁止转发来自MAC地址为00-0C-29-27-55-3F的和主机的数据包" class="headerlink" title="实例24：禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包"></a>实例24：禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3f -j DROP</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> :iptables<br>中使用 <code>-m 模块关键字</code> 的形式调用显示匹配。这里用 <code>-m mac --mac-source</code>来表示数据包的源MAC地址。</p>
<h3 id="实例25：允许防火墙本机对外开放TCP端口-20、21、25、110以及被动模式FTP端口1250-1280"><a href="#实例25：允许防火墙本机对外开放TCP端口-20、21、25、110以及被动模式FTP端口1250-1280" class="headerlink" title="实例25：允许防火墙本机对外开放TCP端口 20、21、25、110以及被动模式FTP端口1250-1280"></a>实例25：允许防火墙本机对外开放TCP端口 20、21、25、110以及被动模式FTP端口1250-1280</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：这里使用 <code>-m multiport -dport</code> 来指定目的端口及范围</p>
<h3 id="实例26：禁止转发源IP地址为192-168-1-20-192-168-1-99的TCP数据包"><a href="#实例26：禁止转发源IP地址为192-168-1-20-192-168-1-99的TCP数据包" class="headerlink" title="实例26：禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包"></a>实例26：禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：此处用 <code>-m -iprange --src-range</code>指定IP范围</p>
<h3 id="实例27：禁止转发与正常TCP连接无关的非-syn请求数据包"><a href="#实例27：禁止转发与正常TCP连接无关的非-syn请求数据包" class="headerlink" title="实例27：禁止转发与正常TCP连接无关的非-syn请求数据包"></a>实例27：禁止转发与正常TCP连接无关的非-syn请求数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：<code>-m state</code> 表示数据包的俩节状态，NEW表示与任何 连接无关的，新的嘛！</p>
<h3 id="实例28：拒绝访问防火墙的新数据包，但允许响应连接或与已有连接相关的数据包"><a href="#实例28：拒绝访问防火墙的新数据包，但允许响应连接或与已有连接相关的数据包" class="headerlink" title="实例28：拒绝访问防火墙的新数据包，但允许响应连接或与已有连接相关的数据包"></a>实例28：拒绝访问防火墙的新数据包，但允许响应连接或与已有连接相关的数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -p tcp -m state --state NEW -j DROP</div><div class="line">iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：<code>ESTABLISHED</code> 表示已经响应请求或者已经建立连接的数据包，<code>RELATED</code> 表示与已建立的连接有相关性的，比如FTP数据连接等。</p>
<h3 id="实例29：只开放本机的web服务（80）、FTP（20、21、20340-20480），放行外部主机发往服务器其他端口的应答数据包，将其他入站数据包均以丢弃处理"><a href="#实例29：只开放本机的web服务（80）、FTP（20、21、20340-20480），放行外部主机发往服务器其他端口的应答数据包，将其他入站数据包均以丢弃处理" class="headerlink" title="实例29：只开放本机的web服务（80）、FTP（20、21、20340-20480），放行外部主机发往服务器其他端口的应答数据包，将其他入站数据包均以丢弃处理"></a>实例29：只开放本机的web服务（80）、FTP（20、21、20340-20480），放行外部主机发往服务器其他端口的应答数据包，将其他入站数据包均以丢弃处理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT</div><div class="line">iptables -I INPUT -p tcp --dport 2045:20480 -j ACCEPT</div><div class="line">iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT</div><div class="line">iptables -P INPUT DROP</div></pre></td></tr></table></figure>

	

	
		<span class="different-posts"><a href="/2017/10/12/2. Linux 命令/81. iptables详解/" onclick="window.history.go(-1); return false;">⬅️ Go back </a></span>

	

</article>

	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
